【PHP】スコープ - 変数の有効範囲
変数には、その変数が利用可能な有効範囲があります。
その有効範囲をスコープと呼び、意図したプログラムを作成するためには必要な知識です。
ここでは、スコープについて解説します。
検証環境
スコープ
スコープは“変数の有効範囲”です。
PHPの変数は宣言された場所・方法によってローカルスコープ、グローバルスコープ、スーパーグローバルスコープのいずれかのスコープ(有効範囲)を持ちます。
ローカルスコープ
ローカルスコープは“ブロック(波括弧{}
)内を対象範囲としたスコープ”です。
関数やメソッドなどのブロック内で宣言した変数はローカルスコープになり、異なるスコープであれば、同じ変数名でも別の変数として扱われます。
<?php
function sample1() {
___ih_hl_start
$message = 'Hello World!';
___ih_hl_end
echo $message."\n";
}
function sample2() {
___ih_hl_start
$message = 'Good Morning!';
___ih_hl_end
echo $message."\n";
}
sample1();
sample2();
?>
$ php sample1.php
Hello World!
Good Morning!
4、9行目の$message
は各関数のブロックを対象にしたローカルスコープの変数です。
関数ごとの変数になるため、sample1
関数とsample2
関数は互いの$message
に影響を及ぼしません
また、ローカルスコープの変数はブロック外からアクセスすると有効範囲外のため、エラーが発生します。
<?php
function sample() {
$message = 'Hello World!';
echo $message."\n";
}
echo $message."\n";
?>
$ php sample2.php
PHP Warning: Undefined variable $message in sample.php on line 8
Warning: Undefined variable $message in sample.php on line 8
グローバルスコープ
グローバルスコープは“ブロック(波括弧{}
)外を対象範囲としたスコープ”です。
ブロック外で宣言した変数はグローバルスコープになり、ブロック外で使用できる他、global
キーワードを使って関数などのブロック内で使うことが可能です。
例えば、次の$message
はグローバルスコープです。
<?php
___ih_hl_start
$message = 'Hello World!';
___ih_hl_end
echo $message."\n";
?>
$ php sample3.php
Hello World!
グローバルスコープの変数を関数のブロック内で使用する場合、global
キーワードを使って、その変数を使うことを宣言します。
<?php
$message = 'Hello World!';
function sample() {
___ih_hl_start
global $message;
___ih_hl_end
echo $message."\n";
}
sample();
?>
$ php sample4.php
Hello World!
global
キーワードを使った宣言がない場合、関数の処理で変数が見つからず、エラーが発生しますので注意してください。
<?php
$message = 'Hello World!';
function sample() {
___ih_diff_start
- global $message;
___ih_diff_end
echo $message."\n";
}
sample();
?>
$ php sample5.php
PHP Warning: Undefined variable $message in sample.php on line 6
Warning: Undefined variable $message in sample.php on line 6
スーパーグローバルスコープ
スーパーグローバルスコープは“PHPがあらかじめ定義した変数の対象範囲のスコープ”です。
PHPがあらかじめ定義した変数はスーパーグローバルスコープになり、次のような変数があります。
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
スーパーグローバルスコープの変数はプログラムのどこでも使うことができます。
それぞれの変数については割愛しますが、ここでは、そのようなスコープがあることを覚えておきましょう。
注意点
PHPのスコープについて2つの注意点があります。
global
の使用
変数はスコープによって、その変数の影響範囲を制限します。
その制限はプログラム構造をシンプルにするための重要な役割を担いますが、global
キーワードは影響範囲を変えてしまうため、時にプログラムを複雑化してしまいます。
そのため、関数のブロック内などでグローバルスコープの変数を使いたい場合は、可能な限り引数でその値のみを与えるようにしましょう。
他言語との比較
他の言語ではif文やfor文などのブロック内の変数は、そのブロック外では使えないことがあります。
しかし、PHPでは使えてしまい、これはプログラムの安定性や可読性低下を招いてしまいます。
そのため、可能な限り変数は宣言したブロック外で使わないようにしましょう。